﻿//using SaaS.Core;
//using SaaS.Model.Entity.Auths;
//using SaaS.Model.Enums;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using XCore.Dapper;
//using XCore.Logger;
//using XCore.Extensions;
//using SaaS.Cache.Auths;
//using XCore.Dependency;

//namespace Web.System.Services.Auths
//{
//    public class PermissionApplicationService : SystemApplicationServiceBase, ITransientDependency
//    {
//        public void Create(int userId, int[] userIds, int? tenantId)
//        {
//            List<DataPermission> list = new List<DataPermission>();
//            foreach (var item in userIds)
//            {
//                if (!SDC.Users.Any(c => c.Id == item && c.TenantId == tenantId)) throw new MessageException($"{CoreSetting.Error_ID}：{item}", (int)LogSource.Peration);
//                if (SDC.DataPermissions.Any(c => c.UserId == userId && c.ParentId == item)) continue;
//                list.Add(new DataPermission { UserId = userId, ParentId = item, TenantId = tenantId });
//            }
//            using (IDapperDatabase dapper = CreateDapperDatabase())
//            {
//                dapper.Insert<DataPermission, int>(list);
//            }
//        }

//        public void SaveCache(int userId, int? tenantId)
//        {
//            var userIds = SDC.DataPermissions.Where(c => c.UserId == userId && c.TenantId == tenantId).Select(c => c.ParentId);
//            SystemAdminCacheService.Instance.SetPermission(userId, userIds, tenantId);
//        }
//        public bool Delete(int userId, int id)
//        {
//            return Repository.Delete<DataPermission>(c => c.ParentId == id && c.UserId == userId);
//        }
//        private IEnumerable<int> GetOrganizationParentUserId(int userId)
//        {
//            int[] orgIds = SDC.UserOrganizationUnits.Where(c => c.UserId == userId).Select(c => c.OrganizationUnitId).ToArray();
//            string sql = $@"/*查找Id为1所有的下级*/
//                                WITH T
//                                AS( 
//                                    SELECT Id,ParentId,Name,0 L FROM Auth_OrganizationUnits WHERE Id in({string.Join(",", orgIds)})
//                                    UNION ALL 
//                                    SELECT U.Id,U.ParentId,U.Name,L+1   
//                                    FROM Auth_OrganizationUnits U INNER JOIN T ON U.ParentId=T.Id  
//                                ) 
//                                SELECT * FROM T";
//            using (IDapperDatabase dapper = CreateDapperDatabase())
//            {
//                var reader = dapper.ExecuteReader(sql);
//                while (reader.Read())
//                {
//                    yield return reader["Id"].ToValue<int>();
//                }
//            }
//        }
//        public void Init(int userId, int? tenantId)
//        {
//            if (!SDC.UserOrganizationUnits.Any(c => c.UserId == userId && c.TenantId == tenantId))
//                throw new MessageException("未归属机构", (int)LogSource.Business);
//            if (!SDC.Users.Any(c => c.Id == userId))
//                throw new MessageException(CoreSetting.Error_ID, (int)LogSource.Peration);
//            var type = SDC.Users.Where(c => c.Id == userId).Select(c => c.Type).FirstOrDefault();
//            if (type == UserAutoType.Level)
//            {
//                var userIds = SDC.Users.Where(c => c.TenantId == tenantId).Select(c => c.Id).ToArray();
//                this.Create(userId, userIds, tenantId);
//                SystemAdminCacheService.Instance.SetPermission(userId, userIds, tenantId);
//            }
//            else if (type == UserAutoType.OwnLevel)
//            {
//                this.Create(userId, new[] { userId }, tenantId);
//                SystemAdminCacheService.Instance.SetPermission(userId, new[] { userId }, tenantId);
//            }
//            else if (type == UserAutoType.ParentLevel)
//            {
//                var userIds = this.GetOrganizationParentUserId(userId).ToArray();
//                this.Create(userId, userIds, tenantId);
//                SystemAdminCacheService.Instance.SetPermission(userId, userIds, tenantId);
//            }
//            else
//            {
//                throw new MessageException("同级未实现", (int)LogSource.Business);
//            }

//        }
//    }
//}
